# @Version : 1.0
# @Author  : wxz
# @File    : redis_client.py
# @Time    : 2025/6/8 21:14
# @Describe: 描述...
import logging

import redis

from config import app_settings

class RedisClient:

    def __init__(self):
        connection_pool = redis.ConnectionPool(
            host=app_settings.redis.host,
            port=app_settings.redis.port,
            db=app_settings.redis.db,
            password=app_settings.redis.password,
            decode_responses=app_settings.redis.decode_responses,
            # 连接池配置
            max_connections=app_settings.redis.max_connections,  # 最大连接数
            socket_connect_timeout=app_settings.redis.socket_connect_timeout,  # 连接超时时间(秒)
            socket_timeout=app_settings.redis.socket_timeout,  # 读写超时时间(秒)
            retry_on_timeout=app_settings.redis.retry_on_timeout,  # 超时后是否重试
            health_check_interval=app_settings.redis.health_check_interval,  # 健康检查间隔(秒)
        )
        self.client = redis.Redis(connection_pool=connection_pool)


    def set(self, key: str, value: str) -> bool:
        """
        Redis SET 命令用于设置给定 key 的值。如果 key 已经存储其他值， SET 就覆写旧值，且无视类型。
        """
        try:
            self.client.set(key, value)
        except redis.RedisError as e:
            logging.error(e, exc_info=True)
            return False

    def set_ex(self, key: str, value: str, ttl: int) -> bool:
        """
        Redis Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在， SETEX 命令将会替换旧的值。
        """
        try:
            self.client.setex(name=key, value=value, time=ttl)
        except redis.RedisError as e:
            logging.error(e, exc_info=True)
            return False

    def get(self, key: str) -> str | None:
        """
        Redis Get 命令用于获取指定 key 的值。如果 key 不存在，返回 nil 。如果key 储存的值不是字符串类型，返回一个错误。
        """
        try:
            return self.client.get(key)
        except redis.RedisError as e:
            logging.error(e, exc_info=True)
            return None

redis_client = RedisClient()

def get_redis_client() -> RedisClient:
    return redis_client